
package $2_2coreclasses;


public class FnRecord {

    public static void main(String[] args) {
        // 记录类
        /**
         * 使用String、Integer等类型的时候，这些类型都是不变类，一个不变类具有以下特点：
         * 1、定义class时使用final，无法派生子类；
         * 2、每个字段使用final，保证创建实例后无法修改任何字段。
         * 
         * 从Java 14开始，引入了新的Record类。我们定义Record类时，使用关键字record。
         * 使用record关键字，可以一行写出一个不变类。
         * 和enum类似，我们自己不能直接从Record派生，只能通过record关键字由编译器实现继承。
         * 
         * 使用record定义的是不变类；
         * 可以编写Compact Constructor对参数进行验证；
         * 可以定义静态方法。
         * */
        Point p = new Point(123, 456);
        System.out.println(p.x());
        System.out.println(p.y());
        System.out.println(p);
        var z = Point.of();
        var pt = Point.of(123, 456);
        System.out.println(z);
        System.out.println(pt);
        
    }
    
    // 我run的时候，java15报错，升级到Java17后，没有报错了。
    public record Point(int x, int y) {
        public Point {
            if (x < 0 || y < 0) {
                throw new IllegalArgumentException();
            }
        }
        // 定义静态方法。
        public static Point of() {
            return new Point(0, 0);
        }
        public static Point of(int x, int y) {
            return new Point(x, y);
        }
    }
    

}
